/* fact template pentru o valoare primita de la server */
(deftemplate data
    (slot temp)
    (slot date) 
    )
/* fact template pentru o cerere de calculare a mediei */
(deftemplate request
    (slot id)
    (slot date1)
    (slot date2) 
    )
/* fact template pentru calcularea mediei */
(deftemplate average
    (slot sum)
    (slot counter)
    )
/* se incarca functia de activare a agentul pentru obtinerea datelor */
(load-function Average.Average)

/* se citeste de la tastatura cererea de calculare a mediei */
/*(defrule start
    =>*/
/* se introduce numarul bazei de date dorit si datele de inceput si sfarsit ale valorilro cerute */
/*    (read ?id  ?d1 ?d2)
    (assert (request (id ?id) (date1 ?d1) (date2 ?d2))) 
)*/

/* apelarea agentului pentru obtinerea datelor */
(defrule get
    ?f<-(request (id ?id) (date1 ?d1) (date2 ?d2))
    =>
    (printout t "apelez" crlf)
    (Average ?id ?d1 ?d2)
    (retract ?f)
    (facts)
)

/* pregatire pentru medie pe masura ce apar valori de la agent */
(defrule calc
    ?f1<-(data (temp ?t) (date ?d))
    ?f2<-(average (sum ?s) (counter ?c))
    =>
    (modify ?f2 (sum (+ ?s ?t)) (counter (+ ?c 1)) )
    (printout t "adun " ?t " la " ?s crlf)
    (retract ?f1)
)

/* calcularea mediei si afisarea rezultatului */
(defrule last
    /* am pus ca prioritate sa se execute ultimul */
    (declare (salience -1))
    /* sa se execute doar daca s-au primit niste valori */
    ?f<-(average (sum ?s) (counter ?c&:(neq ?c 0)))
    =>
    (assert (result (/ ?s ?c)))
    (printout t (/ ?s ?c) crlf)
    (retract ?f)
)
/* se initializeaza datele ajutatoare pentru calcularea mediei cu 0 */
(assert (average (sum 0) (counter 0)))

/* valori de test */
(assert (request (id 1) (date1 "10.05.10") (date2 "12.05.10")))
(run)